<?php
class Auth extends Onecore_Controller
{
    public function __construct() {
        parent::__construct();
    }
    
    public function index(){   
        $this->load->model("groups_model");

        $cfg = new stdClass();
        $cfg->start = 0;
        $cfg->limit = 1000;
        $cfg->orderField = 'description';
        $cfg->orderDirection = 'ASC';
        
        $res = $this->groups_model->listEntities($cfg);
        $data["centers"] = json_encode($res["items"]);

        $this->layout->view('/auth/index',$data);
    }
    public function requestAccount(){             
        $banner["module_name"] = 'Solicitud de Cuenta';
        $banner["module_description"] = 'Solicitud de Cuenta';
        $data["module_banner"] = $this->load->view("/include/sections/module_banner/module_title",$banner,true);
        $data["page_title"] = "Solicitud de Cuenta SACC";
        $data["captcha_code"] = random_string();
        
        $this->session->set_userdata(array('captcha_code'=>$data["captcha_code"]));
        
        $this->layout->view('/auth/requestAccount',$data);
    }
    public function error()
    {
        echo "Error, sin autenticación válida";
    }
    
    public function login(){
	
    }
    
    public function logout(){
        $this->session->sess_destroy();
        redirect('auth/index','location');
    }
    public function requestCreate(){
        $this->load->library('email');
        $this->load->model("systemrols_model");
        $this->load->model("tiporols_model");
        $this->load->model("tipogrupos_model");
        $this->load->model('rols_model');
        $this->load->model('users_model');
        $this->load->model('requests_model');
        $this->load->model('grupos_model');
        $redirect = false;
        $success = false;
        $errorList = array();
        $this->form_validation->set_rules(array(
            array(
                "field"=>"OficioId",
                "label"=>"Identificador de Oficio",
                "rules"=>"required"
                ),
            array(
                "field"=>"SectorId",
                "label"=>"Identificador de Sector",
                "rules"=>"required"
                ),
            array(
                "field"=>"IglesiaId",
                "label"=>"Identificador de Iglesia",
                "rules"=>"required"
                ),
            array(
                "field"=>"username",
                "label"=>"Nombre de usuario",
                "rules"=>"required"
                ),
            array(
                "field"=>"password",
                "label"=>"Contraseña",
                "rules"=>"required"
                ),
            array(
                "field"=>"email",
                "label"=>"Email",
                "rules"=>"required"
                ),
            array(
                "field"=>"nombre1",
                "label"=>"Primer nombre",
                "rules"=>"required"
                ),
            array(
                "field"=>"apellido1",
                "label"=>"Primer apellido",
                "rules"=>"required"
                ),
            array(
                "field"=>"captcha",
                "label"=>"Código Seguridad",
                "rules"=>"required"
                ),
            array(
                "field"=>"invitation_text",
                "label"=>"Quien lo ha invitado",
                "rules"=>"required"
                )
        ));
        $itemName = $this->users_model->getItemName();
        $user_data = $this->input->post();
        if ($this->form_validation->run() == FALSE) {
            $mensaje = "Campos inválidos";
            $errorList = $this->form_validation->_error_array;
        }
        else{
            $captcha = $this->input->post('captcha');
            $captchaSys = $this->session->userdata('captcha_code' );
            if($captcha !== $captchaSys){
                $mensaje = "Codigo de seguridad invalido";
                $errorList = array('Error'=>'El Código de seguridad ingresado es distinto al solicitado. Vuelva a intentarlo por favor.');
            }
            else{
                $memberRol = $this->systemrols_model->getBySystemRolId('miembro');
                $existeUsername = $this->users_model->getByusername($this->input->post('username'));
                if(empty($existeUsername[0])){
                    $existeEmail = $this->users_model->getByemail($this->input->post('email'));
                    if(empty($existeEmail[0])){
                        
                        $iglesia_id = $user_data['IglesiaId'];
                        $rolMiembro = $this->tiporols_model->getBynombrerol('miembro_congregacion'); //estos son metodos magicos
                        $rolMiembro = $rolMiembro[0];
                        $extraData = array(
                            'SystemRolId'=>$memberRol[0]->SystemRolId,
                            'estado'=>'requiere_aprobacion'
                        );
                        $dataUser = array_merge($user_data,$extraData);
                        $data = array(
                            "id" => "",
                            "data" => $this->getInputsToSave($dataUser, $this->users_model->getFields())
                        );
                        
                        $this->db->trans_begin();
                        
                        if ($this->users_model->save($data, false)) {
                            $newUserId = $this->users_model->getLastInsertedId();
                            $grupo_id = $this->users_model->get_id_group_congregation($iglesia_id);
                            if (!empty($grupo_id)) {
                                if (!empty($rolMiembro)) {
                                    $datas = array(
                                        "id" => "",
                                        "data" => array(
                                            'TipoRolId' => $rolMiembro->TipoRolId,
                                            'GrupoId' => $grupo_id->GrupoId,
                                            'UserId' => $newUserId,
                                            'created' => date('Y-m-d')
                                        )
                                    );
                                    if ($this->rols_model->save($datas, false)) {
                                        $member = array();
                                        //se busca al lider del grupo conslidacion de la iglesia seleccionada
                                        $consolidacion = $this->grupos_model->getConsolidationGroupByIglesia($iglesia_id);
                                        if(!empty($consolidacion)){
                                            $members = $this->rols_model->getMembersByGroupId($consolidacion->GrupoId);
                                            if(count($members)>0){
                                                $member = $members[0];
                                            }
                                        }//en caso contrario, se obtiene al lider de la congregacion de la iglesia
                                        else{
                                            $liderCongregation = $this->rols_model->getLiderByGroupId($grupo_id->GrupoId);
                                            if(count($liderCongregation)>0)
                                                $member = $liderCongregation[0];
                                        }
                                        $dataReq = array(
                                            "id" => "",
                                            "data" => array(
                                                'UserIdSend'=>$newUserId,
                                                'UserIdReceive'=>$member->UserId,
                                                'Data'=>json_encode(array('UserId'=>$newUserId)),
                                                'Type'=>'solicitud_crear_cuenta',
                                                'Messages'=>$user_data['invitation_text']
                                            )
                                        );
                                        if ($this->requests_model->save($dataReq, false)) {
                                            $mensaje = "La solicitud ha sido creada en forma exitosa, revise su correo para validar.";
                                            $success = true;
                                            $redirect = true;
                                            $this->email->clear();
                                            $receptorName = $user_data['nombre1'].' '.$user_data['apellido1'];
                                            $this->email->from('notificacion-noresponder@sacc.cl', 'SACC');
                                            $this->email->to($user_data['email']); 
                                            $this->email->subject('Confirmación de solicitud');
                                            $this->email->message('En breve un administrador validará su cuenta para que pueda acceder a la plataforma. <br>----------------------------------<br>SACC - Sistema de administración de Congregaciones Cristianas.');
                                            $this->email->send();
                                        }
                                        else{
                                            $mensaje = "La solicitud no pudo ser creada.";
                                            $errorList = array("Error" => $this->requests_model->getError());
                                        }
                                    } else {
                                        $mensaje = "El nuevo miembro no se puedo incluir en el grupo congregación de la Iglesia seleccionada.";
                                        $errorList = array("Error" => $this->rols_model->getError());
                                    }
                                }
                                else{
                                    $mensaje = "Error de configuración.";
                                    $errorList = array("Error" => 'El Rol miembro_congregacion no existe, agreguelo en el mantenedor de Roles y luego intente de nuevo.');
                                }
                            } else {
                                $mensaje = "No existe el grupo congregación de la Iglesia seleccionada.";
                                $errorList = array("Error" => 'La Iglesia no posee un grupo de tipo congregación. Contactese con el administrador.');
                            }
                        }
                        else{
                            $mensaje = "No se pudo crear la solicitud de nuevo miembro";
                            $errorList = array("Error" => $this->users_model->getError());
                        }
                        if ($success) {
                            $this->db->trans_commit();
                        } else {
                            $this->db->trans_rollback();
                        }
                    }
                    else{
                        $mensaje = "Email ya existe";
                        $redirect = true;
                        $errorList = array('Error'=>'El email ya existe, se le ha enviado un correo con sus datos de acceso.');
                        
                        $this->email->clear();
                        $receptorName = $user_data['nombre1'].' '.$user_data['apellido1'];
                        $this->email->from('notificacion-noresponder@sacc.cl', 'SACC');
                        $this->email->to($user_data['email']); 
                        $this->email->subject('Confirmación de solicitud');
                        $this->email->message('En breve un administrador validará su cuenta para que pueda acceder a la plataforma. <br>----------------------------------<br>SACC - Sistema de administración de Congregaciones Cristianas.');
                        $this->email->send();
                        
                    }
                }
                else{
                    $mensaje = "Nombre de usuario existente";
                    $errorList = array('Error'=>'El nombre de usuario ya existe, pruebe con otro por favor.');
                }
                
            }
        }
        $res = array(
            "success" => $success,
            "msg" => $mensaje,
            "errors" => $errorList,
            "redirect"=>$redirect,
            "captcha_read"=>$this->input->post('captcha'),
            "captcha_setted"=>$this->session->userdata('captcha_code')
        );
        $this->layout->printLike(json_encode($res), "json");
    }
    public function loadOficiosList(){
        $this->load->model("oficios_model");
        $conditions=array();
        $order = array();
        $selected = array();
        $item = $this->input->post('item');
        $defaultValues = array();
        if(!empty($item) && $item !== 'null'){
            $obj = json_decode($item);
            $fields = $this->oficios_model->getFields();
            $conditionsFields = $this->oficios_model->getFieldsConditions();
            $conditions = $this->getConditionsByObject($obj, $conditionsFields,$fields);
        }
        $items = $this->oficios_model->loadList($order,$selected,$conditions,null);
        $data = array(
            'success'=>true,
            'results'=>$items['results'],
            'rows'=>$items['items']
        );
        $this->layout->printLike(json_encode($data),'json');
    }
    public function loadComunasList(){
        $this->load->model("comunas_model");
        $conditions=array();
        $order = array();
        $selected = array();
        $item = $this->input->post('item');
        $defaultValues = array();
        if(!empty($item) && $item !== 'null'){
            $obj = json_decode($item);
            $fields = $this->comunas_model->getFields();
            $conditionsFields = $this->comunas_model->getFieldsConditions();
            $conditions = $this->getConditionsByObject($obj, $conditionsFields,$fields);
        }
        $items = $this->comunas_model->loadList($order,$selected,$conditions,null);
        $data = array(
            'success'=>true,
            'results'=>$items['results'],
            'rows'=>$items['items']
        );
        $this->layout->printLike(json_encode($data),'json');
    }
    public function loadSectoresList(){
        $this->load->model("sectors_model");
        $conditions=array();
        $order = array();
        $selected = array();
        $item = $this->input->post('item');
        $defaultValues = array();
        if(!empty($item) && $item !== 'null'){
            $obj = json_decode($item);
            $fields = $this->sectors_model->getFields();
            $conditionsFields = $this->sectors_model->getFieldsConditions();
            $conditions = $this->getConditionsByObject($obj, $conditionsFields,$fields);
        }
        $items = $this->sectors_model->loadList($order,$selected,$conditions,null);
        $data = array(
            'success'=>true,
            'results'=>$items['results'],
            'rows'=>$items['items']
        );
        $this->layout->printLike(json_encode($data),'json');
    }
    public function loadIglesiasListByComuna(){
        $this->load->model("iglesias_model");
        $selected = array();
        $conditions = array();
        $item = $this->input->post('item');
        $res = array();
        if (!empty($item) && $item !== '') {
            $obj = json_decode($item);
            $res = $this->iglesias_model->loadListByComuna($obj->comuna_id);
        }
        $data = array(
            'success'=>true,
            'results'=>count($res),
            'rows'=>$res
        );
        $this->layout->printLike(json_encode($data), 'json');
    }
}
